﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using FlorDeLiz.BusinessLayer;
using FlorDeLiz.BusinessEntitites;
using FlorDeLiz.Utils;

namespace FlorDeLiz.Cadastro
{
    public partial class CadastroCliente : Form
    {
        private BindingSource clienteBindSource = new BindingSource();

        public CadastroCliente()
        {
            InitializeComponent();
            txtCodigo.Text = string.Empty;
        }

        private void CadastroCliente_Load(object sender, EventArgs e)
        {
            CarregarGrid();
        }

        private void CarregarGrid()
        {
            clienteBindSource.DataSource = ClienteBL.Instancia.ObterClientes(null, string.Empty, string.Empty);
            dgvClientes.AutoGenerateColumns = false;
            dgvClientes.DataSource = clienteBindSource;
            dgvClientes.ClearSelection();
        }        

        private void brnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void dgvClientes_SelectionChanged(object sender, EventArgs e)
        {
            if (dgvClientes.SelectedRows.Count > 0)
            {
                Cliente cliente = (Cliente)dgvClientes.SelectedRows[0].DataBoundItem;

                if (cliente != null)
                {
                    txtCodigo.Text = cliente.Id.ToString();
                    txtNome.Text = cliente.Nome;
                    txtCPF.Text = cliente.CPF_CNPJ;
                    dtpDataNascimento.Value = cliente.DataNascimento;
                    txtEmail.Text = cliente.Email;
                    txtTelResidencial.Text = cliente.TelResidencial;
                    txtTelCelular.Text = cliente.TelCelular;
                    txtEndereco.Text = cliente.Endereco;
                    txtNumero.Text = cliente.Numero;
                    cmdEstado.SelectedValue = cliente.Estado;
                    txtCidade.Text = cliente.Cidade;
                    txtBairro.Text = cliente.Bairro;
                }

            }
            else
            {
                LimparCampos();
            }
        }

        private void btnNovo_Click(object sender, EventArgs e)
        {
            dgvClientes.ClearSelection();               
        }

        private void LimparCampos()
        {
            txtCodigo.Text = string.Empty;
            txtNome.Text = string.Empty;
            txtCPF.Text = string.Empty;
            dtpDataNascimento.Value = DateTime.Now.Date;
            txtEmail.Text = string.Empty;
            txtEndereco.Text = string.Empty;
            txtNumero.Text = string.Empty;
            txtTelCelular.Text = string.Empty;
            txtTelResidencial.Text = string.Empty;
            cmdEstado.SelectedValue = "MG";
            txtBairro.Text = "Centro";
            txtCidade.Text = "Perdizes";

            lblErrorBairro.Visible = false;
            lblErrorCidade.Visible = false;
            lblErrorCPF.Visible = false;
            lblErrorData.Visible = false;
            lblErrorEmail.Visible = false;
            lblErrorEndereco.Visible = false;
            lblErrorNome.Visible = false;
            lblErrorNumero.Visible = false;
            lblErrorTelCelular.Visible = false;
            lblErrorTelResidencial.Visible = false;
        }

        private void btnGravar_Click(object sender, EventArgs e)
        {
            if (ValidarCampos())
            {
                Cliente cliente = new Cliente();
                int codigo = 0;
                int.TryParse(txtCodigo.Text, out codigo);
                cliente.Id = codigo;
                cliente.Nome = txtNome.Text.Trim().ToUpper();
                cliente.CPF_CNPJ = txtCPF.Text.Replace(",", "").Replace(".", "").Replace("-", "").Trim();
                cliente.DataNascimento = dtpDataNascimento.Value;
                cliente.Email = txtEmail.Text.Trim().ToUpper();
                cliente.Endereco = txtEndereco.Text.Trim().ToUpper();
                cliente.Numero = txtNumero.Text.Trim().ToUpper();
                cliente.TelCelular = txtTelCelular.Text.Replace("(", "").Replace("-", "").Replace(")", "").Trim();
                cliente.TelResidencial = txtTelResidencial.Text.Replace("(", "").Replace("-", "").Replace(")", "").Trim();
                cliente.Estado = cmdEstado.SelectedItem.ToString().Trim().ToUpper();
                cliente.Bairro = txtBairro.Text.Trim().ToUpper();
                cliente.Cidade = txtCidade.Text.Trim().ToUpper();

                ClienteBL.Instancia.GravarCliente(cliente);
                CarregarGrid();
            }            
        }

        private bool ValidarCampos()
        {
            StringBuilder sb = new StringBuilder();
            if (string.IsNullOrEmpty(txtNome.Text.Trim()))
            {
                sb.AppendLine("O campo Nome é obrigatório!");
                lblErrorNome.Visible = true;
            }

            if (string.IsNullOrEmpty(txtCPF.Text.Replace(",", "").Replace(".", "").Replace("-", "").Trim()))
            {
                sb.AppendLine("O campo CPF é obrigatório!");
                lblErrorCPF.Visible = true;
            }
            else if (!Util.Instancia.ValidarCPF(txtCPF.Text.Replace(",", "").Replace(".", "").Replace("-", "").Trim()))
            {
                sb.AppendLine("O CPF informado é inválido!");
                lblErrorCPF.Visible = true;
            }

            if (dtpDataNascimento.Value.Date > DateTime.Now.Date)
            {
                sb.AppendLine("A Data de Nascimento deve ser menor que a Data Atual!");
                lblErrorData.Visible = true;
            }

            if (string.IsNullOrEmpty(txtEndereco.Text.Trim()))
            {
                sb.AppendLine("O campo Endereço é obrigatório!");
                lblErrorEndereco.Visible = true;
            }

            if (string.IsNullOrEmpty(txtNumero.Text.Trim()))
            {
                sb.AppendLine("O campo Número é obrigatório!");
                lblErrorNumero.Visible = true;
            }

            if (string.IsNullOrEmpty(txtTelCelular.Text.Replace("(","").Replace("-","").Replace(")","").Trim()) &&
                string.IsNullOrEmpty(txtTelResidencial.Text.Replace("(", "").Replace("-", "").Replace(")", "").Trim()))
            {
                sb.AppendLine("Digite pelo menos um telefone de contato!");
                lblErrorTelCelular.Visible = true;
                lblErrorTelResidencial.Visible = true;
            }

            if (string.IsNullOrEmpty(txtBairro.Text.Trim()))
            {
                sb.AppendLine("O campo Bairro é obrigatório!");
                lblErrorBairro.Visible = true;
            }

            if (string.IsNullOrEmpty(txtCidade.Text.Trim()))
            {
                sb.AppendLine("O campo Cidade é obrigatório!");
                lblErrorCidade.Visible = true;
            }

            if (!string.IsNullOrEmpty(txtEmail.Text.Trim()))
            {
                if (!Util.Instancia.ValidarEmail(txtEmail.Text.Trim()))
                {
                    sb.AppendLine("O email informado é inválido!");
                    lblErrorEmail.Visible = true;
                }
            }

            if (!string.IsNullOrEmpty(sb.ToString()))
            {
                MessageBox.Show(sb.ToString(), "Atenção!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return false;
            }
            else
            {
                return true;
            }
        }       

        private void txtCPF_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = Util.Instancia.ValidarDigito(e.KeyChar);
        }        

        private void txtTelResidencial_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = Util.Instancia.ValidarDigito(e.KeyChar);
        }

        private void txtTelCelular_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = Util.Instancia.ValidarDigito(e.KeyChar);
        }

        private void txtPesquisa_TextChanged(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(txtPesquisa.Text.Trim()) && txtPesquisa.Text.Length >= 3)
            {
                List<Cliente> clientes = new List<Cliente>();
                clientes = ((List<Cliente>)clienteBindSource.DataSource).FindAll(c => c.Nome.ToUpper().Contains(txtPesquisa.Text.ToUpper().Trim()));
                dgvClientes.DataSource = clientes;
            }
            else
            {
                dgvClientes.DataSource = clienteBindSource.DataSource;
            }
            dgvClientes.ClearSelection();
        }       
    }
}
